package controller;

import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/3/11 11:39
 * Version:1.0-SNAPSHOT
 */
@Controller
@RequestMapping("/request")
public class RequestController {

    @RequestMapping("/f1")
    public String f1(HttpServletRequest request){
        System.out.println("RequestController.f1");
        User user =new User();
        user.setUsername("admin");
        request.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("/f2")
    public String f2(@ModelAttribute("u") User user){
        System.out.println("RequestController.f2");
        user.setUsername("alice");
        return "scope";
    }

    // 当注解的key与变量名一致时,注解的key可以省略
    @RequestMapping("/f3")
    public String f3(@ModelAttribute User user){
        System.out.println("RequestController.f3");
        user.setUsername("alice");
//        return "scope";
        return "redirect:/showScope";
    }

    // 当方法的参数满足以下条件时
    // 1.当前方法的参数没有被任何注解所标注
    // 2.当前方法的参数是一个对象的时候
    // 此时会自动添加@ModelAttribute注解
    // 总结:当方法的参数没有被任何注解所标注时,会存在默认行为
    // 1.如果方法的参数是一个对象,则默认添加@ModelAttribute注解
    // 2.如果方法的参数不是一个对象,则默认添加@RequestParam注解
    @RequestMapping("/f4")
    public String f4(User user){
        System.out.println("RequestController.f4");
        user.setUsername("jack");
        return "scope";
    }


    // 当方法被@ModelAttribute标注时
    // 表示当前方法不是用于直接访问的
    // 而是当用户访问当前类中其他方法时
    // 均会先执行该方法
    @ModelAttribute
    public void f5(){
        System.out.println("RequestController.f5");
    }

    // 当执行某一个业务的时候
    // 当前Controller中存在多个Handler拥有相同的业务
    // 此时可以把该业务提取出来
    // 在被@ModelAttribute标注的方法下执行
    // 当需要通过@ModelAttribute标注的方法传递数据时
    // 此时注解可以存在参数,参数即为key
    // 此时方法可以存在返回值,返回值即为value
    // 操作的仍然是request作用域
    @ModelAttribute("users")
    public List<User> findAll(){
        List<User> users = new ArrayList<>();
        User user = new User(1,"admin","123456","13812345678","江苏-南京");
        User user2 = new User(2,"jack","123456","13812345678","江苏-南京");
        User user3 = new User(3,"tom","123456","13812345678","江苏-南京");

        users.add(user);
        users.add(user2);
        users.add(user3);

        return users;
    }

}
